package com.huluobo.sign.view

import android.text.TextUtils
import android.util.Log
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material3.Button
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.compose.ui.viewinterop.AndroidView
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.navigation.NavHostController
import com.amap.api.maps.AMap
import com.amap.api.maps.MapView
import com.amap.api.maps.model.MyLocationStyle
import com.amap.api.services.core.LatLonPoint
import com.amap.api.services.geocoder.GeocodeResult
import com.amap.api.services.geocoder.GeocodeSearch
import com.amap.api.services.geocoder.RegeocodeQuery
import com.amap.api.services.geocoder.RegeocodeResult
import com.blankj.utilcode.util.ToastUtils
import com.huluobo.lib_base.BaseApp
import com.huluobo.lib_base.BaseTitle
import com.huluobo.lib_base.UIState
import com.huluobo.lib_http.Const
import com.huluobo.sign.SignIntent
import com.huluobo.sign.SignViewModel
import com.tencent.mmkv.MMKV
import kotlinx.coroutines.launch
import java.text.SimpleDateFormat
import java.util.Timer
import kotlin.concurrent.timerTask

/**
 *  Created by LC on 2025/4/29.
 */
//高德地图map
lateinit var map: AMap

//地图view
lateinit var mapView: MapView

//定位信息
lateinit var myLocationStyle: MyLocationStyle

//地理位置信息检索
lateinit var geocodeSearch: GeocodeSearch

//地理位置信息查询
lateinit var query: RegeocodeQuery

//计时器
lateinit var timer: Timer

@Composable
fun SignCommitPage(navHostController: NavHostController, vm: SignViewModel = hiltViewModel()) {

    //上班打卡显示事假,默认显示一个字符串
    var startTIme by remember {
        mutableStateOf("上班还未打卡")
    }

    //下班打卡时间
    var endTime by remember {
        mutableStateOf("下班还未打卡")
    }

    //打卡按钮的文字
    var btnName by remember {
        mutableStateOf("上班打卡")
    }

    //按钮上显示的时间
    var nowTime by remember {
        mutableStateOf("00:00:00")
    }

    //打卡按钮是否可以点击,默认可以点击,如果下班卡打完,当日不可再次点击
    var enable by remember {
        mutableStateOf(true)
    }

    //存取打卡时间
    val kv = MMKV.defaultMMKV()

    var lat by remember {
        mutableStateOf(0.0)
    }

    var lon by remember {
        mutableStateOf(0.0)
    }

    var type = ""
    var status = ""
    var address by remember {
        mutableStateOf("")
    }

    LaunchedEffect(key1 = "", block = {
        //计时器的协程,用于更新当前按钮上的时间
        launch {
            timer = Timer()
            timer.schedule(timerTask {
                nowTime = SimpleDateFormat("HH:mm:ss").format(System.currentTimeMillis())
            }, 0, 1000)
        }

        launch {
            //取出上班打卡时间
            val signTime = kv.decodeString(Const.PARAM_SIGN_IN, "").toString()
            //判断上班打卡是否为空
            if (!TextUtils.isEmpty(signTime)) {
                //获取当前的日期
                val time = SimpleDateFormat("yyyy-MM-dd").format(System.currentTimeMillis())
                val statusIn = kv.decodeString(Const.PARAM_STATUS_IN).toString()
                //截取保存的上班时间,取到日期即可,需要判断是否是今天
                //2025-4-29 15:31:00
                //2025-4-29
                val signDate = signTime.substring(0, 10)
                //判断当前时间和kv中取出的时间是否相等,如果相等,就代表今天已经打过卡,需要在页面上赋值
                if (time == signDate) {
                    //如果kv中取出的日期等于当前日期,证明今天打过卡,需要从kv中取出时间进行页面赋值
                    startTIme = "上班时间 : $signTime $statusIn"
                    //同时,按钮文字赋值为下班打卡
                    btnName = "下班打卡"
                    //取出下班日期用于判断
                    val outTime = kv.decodeString(Const.PARAM_SIGN_OUT, "").toString()
                    //如果下班时间不为空,需要判断是否是今天打过下班卡,如果没有,则无事发生
                    if (!TextUtils.isEmpty(outTime)) {
                        val statusOut = kv.decodeString(Const.PARAM_STATUS_OUT).toString()
                        //截取时间到日期
                        val outDate = outTime.substring(0, 10)
                        //对比是否是今天
                        if (time == outDate) {
                            //如果是,下班卡赋值
                            endTime = "下班时间 : $outTime $statusOut"
                            //设置按钮为不可点
                            enable = false
                        }
                    }
                } else {
                    //kv中取出的时间不等于当前日期,证明今天没打过卡,赋值为上班打卡
                    btnName = "上班打卡"
                }
            }
        }

        launch {
            vm.state.collect {
                when (it) {
                    is UIState.OnError -> {
                        Log.e("TagA", "提交签到信息失败:${it.msg}")
                    }

                    UIState.OnLoading -> {}
                    is UIState.OnSuccess<*> -> {
                        ToastUtils.showLong("签到/签退成功")
                    }
                }
            }
        }
    })

    Column(Modifier.padding(10.dp), horizontalAlignment = Alignment.CenterHorizontally) {
        BaseTitle(title = "签到/签退", navHostController = navHostController)
        AndroidView(modifier = Modifier.height(300.dp), factory = {
            //new出地图的view
            mapView = MapView(it)
            //创建地图
            mapView.onCreate(null)
            //从地图view中获取地图控件
            map = mapView.map
            //new出定位信息
            myLocationStyle = MyLocationStyle()
            //设定定位的刷新时间
            myLocationStyle.interval(2000)
            //添加定位信息到地图控件上
            map.myLocationStyle = myLocationStyle
            //打开定位开关
            map.isMyLocationEnabled = true
            map.addOnMyLocationChangeListener { location ->
                geocodeSearch = GeocodeSearch(BaseApp.context)
                //LatLonPoint(location.latitude, location.longitude) 坐标点,包含经纬度,扫描频次,指定扫描的模式
                query = RegeocodeQuery(LatLonPoint(location.latitude, location.longitude), 200f, GeocodeSearch.AMAP)
                geocodeSearch.getFromLocationAsyn(query)
                geocodeSearch.setOnGeocodeSearchListener(object : GeocodeSearch.OnGeocodeSearchListener {
                    override fun onRegeocodeSearched(result: RegeocodeResult?, error: Int) {
                        lon = location.longitude
                        lat = location.latitude
                        address = result?.regeocodeAddress?.formatAddress.toString()
                    }

                    override fun onGeocodeSearched(p0: GeocodeResult?, p1: Int) {
                    }
                })
            }

            //返回出地图view
            mapView
        })

        Spacer(modifier = Modifier.height(50.dp))
        Text(
            text = startTIme,
            Modifier
                .fillMaxWidth()
                .padding(start = 20.dp)
        )
        Spacer(modifier = Modifier.height(20.dp))
        Text(
            text = endTime,
            Modifier
                .fillMaxWidth()
                .padding(start = 20.dp)
        )
        Spacer(modifier = Modifier.height(20.dp))
        Button(
            onClick = {
                val time = SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(System.currentTimeMillis())
                val workStart = "08:30:00"
                val workEnd = "17:30:00"
                //2025-4-29 15:58:00
                if (btnName == "上班打卡") {
                    kv.encode(Const.PARAM_SIGN_IN, time)
                    status = if (time.substring(11, time.length) > workStart) "迟到" else "正常"
                    kv.encode(Const.PARAM_STATUS_IN, status)
                    startTIme = "上班时间 : $time $status"
                    btnName = "下班打卡"
                    type = "上班"
                    val map = mapOf(
                        Const.PARAM_LAT to lat,
                        Const.PARAM_LON to lon,
                        Const.PARAM_TYPE to type,
                        Const.PARAM_STATUS to status,
                        Const.PARAM_ADDRESS to address,
                    )
                    vm.sendIntent(SignIntent.AddSign(map))
                } else {
                    kv.encode(Const.PARAM_SIGN_OUT, time)
                    status = if (time.substring(11, time.length) < workEnd) "早退" else "正常"
                    kv.encode(Const.PARAM_STATUS_OUT, status)
                    endTime = "下班时间 : $time $status"
                    enable = false
                    type = "下班"
                    val map = mapOf(
                        Const.PARAM_LAT to lat,
                        Const.PARAM_LON to lon,
                        Const.PARAM_TYPE to type,
                        Const.PARAM_STATUS to status,
                        Const.PARAM_ADDRESS to address,
                    )
                    vm.sendIntent(SignIntent.AddSign(map))
                }
            },
            enabled = enable,
            modifier = Modifier
                .size(140.dp)
                .clip(CircleShape)
        ) {
            Column {
                Text(text = btnName, fontSize = 22.sp)
                Text(text = nowTime, fontSize = 22.sp)
            }
        }
    }
}